package sum.book.common.core.utils;

import org.springframework.beans.BeanUtils;

import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

public class SimpleConverter {

    /**
     * 将原对象内容复制到目标对象
     *
     * @param orig 原始对象
     * @param dest 目标对象
     */
    public static void copyProperties(Object orig, Object dest) {
        BeanUtils.copyProperties(orig, dest);
    }

    /**
     *
     * 根据原生对象生成新对象
     * <p>
     *
     * <pre>
     * 例如把 User 对象 转为 UserDTO：
     *  UserDTO userDTO = SimpleConverter.convert(user, UserDTO.class);
     * </pre>
     *
     * @param orig 原始对象
     * @param dest 目标对象class
     * @param <T> 泛型
     * @return 目标对象实例
     */
    public static <T> T convert(Object orig, Class<T> dest) {
        return convert(orig, dest, (String[])null);
    }

    /**
     * 根据原生对象生成新对象，并忽略指定字段
     * <p>
     *
     * @param orig 原始对象
     * @param dest 目标对象class
     * @param ignoreProperties 不做赋值属性
     * @param <T> 泛型
     * @return 转换后的对象
     */
    public static <T> T convert(Object orig, Class<T> dest, String... ignoreProperties) {
        if (Objects.isNull(orig)) {
            return null;
        }
        T obj = null;
        try {
            obj = dest.newInstance();
            BeanUtils.copyProperties(orig, obj, ignoreProperties);
        } catch (Exception e) {
            throw new RuntimeException(MessageFormat.format("Convert error: {0} to {1}", orig, obj), e);
        }

        return obj;
    }

    /**
     * 根据原生集合生成新集合
     * <p>
     *
     * <pre>
     * List<UserDTO> list = Arrays.asList(new UserDTO("name", "country"));
     * List<UserVO> vos = SimpleConverter.convert(list, UserVO.class);
     * </pre>
     *
     * @param orig 原始list对象
     * @param dest 目标list对象的泛型
     * @param <F> 原始list对象的泛型
     * @param <T> 目标list对象的泛型
     * @return 转换后的对象
     */
    public static <F, T> List<T> convert(List<F> orig, final Class<T> dest) {
        if (Objects.isNull(orig)) {
            return null;
        }
        List<T> list = new ArrayList<>();

        for (F o : orig) {
            T t = convert(o, dest);
            list.add(t);
        }

        return list;
    }

}
